

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "a.h"
int cc_sum=0;
int cc_num=10;
int kh_sum=0;
int kh_num=10;
static int gl_id=123;
static char gl_password[20]={"qq"};
struct cc *c=NULL;
struct kh *k=NULL;
void init(){
	c=malloc(sizeof(struct cc)*cc_num);
	k=malloc(sizeof(struct cc)*kh_num);
}
void close(){
	int i,j,l;
	for(i=0;i<cc_sum;i++){
		for(j=0;j<c[i].cz_num;j++){
			for(l=0;l<6;l++)
			{
				free(c[i].pcz[j][l]);
			}
			free(c[i].pcz[j]);
		}
		free(c[i].pcz);
		free(c[i].z);
	}
	free(c);
	for(i=0;i<kh_sum;i++){
		free(k[i].p);
	}
	free(k);
}
void save(){
	FILE *pf_cc_n=fopen("cc_n.txt","w");
	fprintf(pf_cc_n,"%d\t%d\n",cc_sum,cc_num);
	fclose(pf_cc_n);
	int i,j,l,m;
	FILE *pf_cc=fopen("cc.txt","w");
	for(i=0;i<cc_sum;i++){
		fprintf(pf_cc,"%s\t%d\t%d\n",c[i].cc_name,c[i].cz_sum,c[i].cz_num);
		for(j=0;j<c[i].cz_num;j++){
			fprintf(pf_cc,"%d\t%s\t%d\n",c[i].z[j].cz_id,c[i].z[j].cz_name,c[i].z[j].price);
			for(l=0;l<6;l++){
				for(m=0;m<10;m++){
					fprintf(pf_cc,"%d\n",c[i].pcz[j][l][m]);
				}
			}	
		}
	}
	fclose(pf_cc);
	
	FILE *pf_kh_n=fopen("kh_n.txt","w");
	fprintf(pf_kh_n,"%d\t%d\n",kh_sum,kh_num);
	fclose(pf_kh_n);
	
	FILE *pf_kh=fopen("kh.txt","w");
	for(i=0;i<kh_sum;i++){
		fprintf(pf_kh,"%s\t%d\t%s\t%d\t%d\n",k[i].kh_name,k[i].kh_id,k[i].password,k[i].cp_sum,k[i].cp_num);
		for(j=0;j<k[i].cp_sum;j++){
			fprintf(pf_kh,"%s\t%s\t%s\t%d\t%d\t%d\n",k[i].p[j].cp_cc,k[i].p[j].cp_start,k[i].p[j].cp_dest,k[i].p[j].cp_price,k[i].p[j].cp_cx,k[i].p[j].cp_zw);
		}
	}
	fclose(pf_kh);
	
}
void read(){
	FILE *pf_cc_n=fopen("cc_n.txt","r");
	if(pf_cc_n==NULL){
		return;
	}
	fscanf(pf_cc_n,"%d\t%d\n",&cc_sum,&cc_num);
	fclose(pf_cc_n);
	c=realloc(c,sizeof(struct cc)*cc_num);
	printf("11411\n");
	int i,j,l,m;
	FILE *pf_cc=fopen("cc.txt","r");
	for(i=0;i<cc_sum;i++){
		fscanf(pf_cc,"%s\t%d\t%d\n",c[i].cc_name,&c[i].cz_sum,&c[i].cz_num);
		c[i].z=malloc(sizeof(struct cz)*c[i].cz_num);
		c[i].pcz=(int***)malloc(sizeof(int**)*c[i].cz_num);
		for(j=0;j<c[i].cz_num;j++){
			c[i].pcz[j]=(int**)malloc(sizeof(int*)*6);
			for(l=0;l<6;l++){
				c[i].pcz[j][l]=(int*)malloc(sizeof(int)*10);
				for(m=0;m<10;m++)
				{
					c[i].pcz[j][l][m]=0;
				}
			}
		}
		for(j=0;j<c[i].cz_num;j++){
			fscanf(pf_cc,"%d\t%s\t%d\n",&c[i].z[j].cz_id,c[i].z[j].cz_name,&c[i].z[j].price);
			for(l=0;l<6;l++){
				for(m=0;m<10;m++){
					fscanf(pf_cc,"%d\n",&c[i].pcz[j][l][m]);
				}
			}	
		}
	}
	fclose(pf_cc);
	FILE *pf_kh_n=fopen("kh_n.txt","r");
	if(pf_kh_n==NULL){
		return;
	}
	fscanf(pf_kh_n,"%d\t%d\n",&kh_sum,&kh_num);
	fclose(pf_kh_n);
	
	FILE *pf_kh=fopen("kh.txt","r");
	for(i=0;i<kh_sum;i++){
		fscanf(pf_kh,"%s\t%d\t%s\t%d\t%d\n",k[i].kh_name,&k[i].kh_id,k[i].password,&k[i].cp_sum,&k[i].cp_num);
		k[i].p=malloc(sizeof(struct cp)*k[i].cp_num);
		for(j=0;j<k[i].cp_sum;j++){		fscanf(pf_kh,"%s\t%s\t%s\t%d\t%d\t%d\n",k[i].p[j].cp_cc,k[i].p[j].cp_start,k[i].p[j].cp_dest,&k[i].p[j].cp_price,&k[i].p[j].cp_cx,&k[i].p[j].cp_zw);
		}
	}
	fclose(pf_kh);
}

void find_pj(){
	int i,j,l,h=0,start_price,dest_price;
	char start_cz_name[40];
	char dest_cz_name[40];
	char cc_name[40];
	printf("输入始发站：");
	scanf("%s",start_cz_name);
	printf("输入终点站：");
	scanf("%s",dest_cz_name);
	for(i=0;i<cc_sum;i++){
		for(j=0;j<c[i].cz_sum;j++){
			if(strcmp(start_cz_name,c[i].z[j].cz_name)==0){
				start_price=c[i].z[j].price;
				for(l=j;l<c[j].cz_sum;l++){
					if(strcmp(dest_cz_name,c[i].z[l].cz_name)==0){
						dest_price=c[i].z[l].price;
						printf("始发站：%s---终点站：%s---车次：%s---票价：%d\n",start_cz_name,dest_cz_name,c[i].cc_name,dest_price-start_price);
						h=1;
					}
				}
			}
		}
	}
	if(h==1){
		return;
	}
	if(h==0){
		printf("暂无途径这两个站的车次\n");
		return;
	}
}					
void kh_menu(){
	int m=0;
	while(1){
		printf("#######铁路售票系统#######\n");
		printf("#########客户界面########\n");
		printf("请选择以下栏目：\n");
		printf("1、登录;\n");
		printf("2、注册;\n");
		printf("3、返回;\n");
		scanf("%d",&m);
		if(m==1){
			kh_dl();
		}
		else if(m==2){
			kh_zc();
		}
		else if(m==3){
			break;
		}
		else{
			printf("输入错误，请重新输入！\n");
		}
	}
}
void kh_dl(){
	int i,kh_id;
	char password[40];
	printf("ID=");
	scanf("%d",&kh_id);
	printf("密码=");
	scanf("%s",password);
	for(i=0;i<kh_sum;i++){
		if(kh_id==k[i].kh_id && strcmp(password,k[i].password)==0){
			int m=0;
			while(1){
				printf("1、购票\n");
				printf("2、查询已购票\n");
				printf("3、返回\n");
				scanf("%d",&m);
				if(m==1){
					kh_gp(i);
					return;
				}
				else if(m==2){
					kh_find(i);
					return;
				}
				else if(m==3){
					return;
				}
				else{
					printf("输入错误，请重新输入！\n");
				}		
			}
		}	
	}
	printf("id/密码输入错误，请重新输入\n");		
}
void kh_gp(int a){
	int i,j,l,h=0,start_price,dest_price;
	char start_cz_name[40];
	char dest_cz_name[40];
	char cc_name[40];
	printf("输入始发站：");
	scanf("%s",start_cz_name);
	printf("输入终点站：");
	scanf("%s",dest_cz_name);
	for(i=0;i<cc_sum;i++){
		for(j=0;j<c[i].cz_sum;j++){
			if(strcmp(start_cz_name,c[i].z[j].cz_name)==0){
				start_price=c[i].z[j].price;
				for(l=j;l<c[i].cz_sum;l++){
					if(strcmp(dest_cz_name,c[i].z[l].cz_name)==0){
						dest_price=c[i].z[l].price;
						printf("始发站：%s---终点站：%s---车次：%s---票价：%d\n",start_cz_name,dest_cz_name,c[i].cc_name,dest_price-start_price);
						h=1;
					}
				}
			}
		}
	}
	if(h==1){
		printf("请选择上述某一车次：");
		scanf("%s",cc_name);
		for(i=0;i<cc_sum;i++){
			if(strcmp(cc_name,c[i].cc_name)==0){
				for(j=0;j<c[i].cz_sum;j++){
					if(strcmp(start_cz_name,c[i].z[j].cz_name)==0){
						start_price=c[i].z[j].price;
						for(l=j;l<c[i].cz_sum;l++){
							if(strcmp(dest_cz_name,c[i].z[l].cz_name)==0){
								dest_price=c[i].z[l].price;
								printf("您所选择的为:\n");
								printf("车次：%s---始发站：%s---终点站：%s---票价：%d\n",c[i].cc_name,start_cz_name,dest_cz_name,dest_price-start_price);	
								int f,m,n,o=j;
								for(m=0;m<6;m++){//箱
									for(n=0;n<10;n++){//座
										for(j;j<l;j++){//站
											f=0;
											if(c[i].pcz[j][m][n]!=0){
											f=1;break;
											}
										}
										printf("%d\n",f);
										if(f==0){
											for(;o<l;o++){
												c[i].pcz[o][m][n]=k[a].kh_id;
											}
											if(k[a].cp_sum>=k[a].cp_num){
												k[a].cp_num=k[a].cp_num+k[a].cp_num/3;
												k[a].p=realloc(k[a].p,sizeof(struct cp)*k[a].cp_num);
											}
											strcpy(k[a].p[k[a].cp_sum].cp_cc,c[i].cc_name);
											strcpy(k[a].p[k[a].cp_sum].cp_start,start_cz_name);
											strcpy(k[a].p[k[a].cp_sum].cp_dest,dest_cz_name);
											k[a].p[k[a].cp_sum].cp_price=dest_price-start_price;
											k[a].p[k[a].cp_sum].cp_cx=m;
											k[a].p[k[a].cp_sum].cp_zw=n;
											printf("您的座位为：%d车厢---%d号座\n",m,n);
											k[a].cp_sum++;
											return;
										}
										
									}
								}
								printf("暂无余票\n");
								return;
							}
						}
					}
				}
			}
		}
	}
	if(h==0){
		printf("暂无途径这两个站的车次\n");
		return;
	}
}
void kh_find(int a){
	if(k[a].cp_sum==0){
		printf("暂无购票信息\n");
		return;
	}
	printf("####购票信息#####\n");
	printf("已购票%d张,详情如下：\n",k[a].cp_sum);
	for(int i=0;i<k[a].cp_sum;i++){
		printf("%d、车次：%s---%s到%s---%d车厢%d座---价格：%d元\n",i+1,k[a].p[i].cp_cc,k[a].p[i].cp_start,k[a].p[i].cp_dest,k[a].p[i].cp_cx,k[a].p[i].cp_zw,k[a].p[i].cp_price);
	}
	return;
}

void kh_zc()
{
	int i;int kh_id;
	if(kh_sum>=kh_num){
		kh_num=kh_num+kh_num/3;
		k=realloc(k,sizeof(struct cc)*kh_num);
	}
	printf("输入客户的ID：");
	scanf("%d",&kh_id);
	for(i=0;i<kh_sum;i++){
		if(kh_id==k[i].kh_id){
			printf("该ID已被注册，请重新输入！\n");
			return;
		}
	}
	k[kh_sum].kh_id=kh_id;
	printf("请输入您的姓名：");
	scanf("%s",k[kh_sum].kh_name);
	printf("请输入您的密码：");
	scanf("%s",k[kh_sum].password);
	printf("注册成功\n");
	k[kh_sum].cp_sum=0;k[kh_sum].cp_num=5;
	k[kh_sum].p=malloc(sizeof(struct cp)*k[kh_sum].cp_num);
	kh_sum++;
}
void gl_dl_menu(){
	int m=0;
	while(1){
		printf("#######铁路售票系统#######\n");
		printf("######管理员登录界面######\n");
		printf("请选择以下栏目：\n");
		printf("1、登录;\n");
		printf("2、返回;\n");
		scanf("%d",&m);
		switch(m){
			case 1:
				gl_dl();
				break;
			case 2:
				return;
			default:
				printf("输入错误\n");
				break;
		}
	}
}
void gl_dl(){
	int i,id;
	char password[20];
	printf("ID=");
	scanf("%d",&id);
	printf("密码=");
	scanf("%s",password);
	if(id==gl_id && strcmp(password,gl_password)==0){
		printf("登录成功\n");
		gl_menu();
	}
	else{
		printf("ID/密码输入错误，请重新输入\n");
		return;
	}
}
		
void gl_menu(){
	int m=0;
	while(1){
		printf("#######铁路售票系统#######\n");
		printf("########管理员界面########\n");
		printf("请选择以下栏目：\n");
		printf("1、添加车次;\n");
		printf("2、更新车次;\n");
		printf("3、删除车次\n");
		printf("4、返回\n");
		scanf("%d",&m);
		switch(m){
			case 1:
				add_cc();
				break;
			case 2:
				update_cc();
				break;
			case 3:
				delete_cc();
				break;
			case 4:
				return;
			default:
				printf("输入错误\n");
				break;
		}
	}
}
void add_cc(){
	char add_cc_name[40];
	if(cc_sum>=cc_num){
		cc_num=cc_num+cc_num/3;
		c=realloc(c,sizeof(struct cc)*cc_num);
	}
	
	printf("输入车次的名称：");
	scanf("%s",add_cc_name);
	int i,j,k;
	for(i=0;i<cc_sum;i++){
		if(strcmp(add_cc_name,c[i].cc_name)==0){
			printf("已有本车次，请重新输入！\n");
			return;
		}
	}
	strcpy(c[cc_sum].cc_name,add_cc_name);
	c[cc_sum].cz_sum=0;
	c[cc_sum].cz_num=5;
	c[cc_sum].z=malloc(sizeof(struct cz)*c[cc_sum].cz_num);
	c[cc_sum].pcz=(int***)malloc(sizeof(int**)*c[cc_sum].cz_num);
	for(i=0;i<c[cc_sum].cz_num;i++){
		c[cc_sum].pcz[i]=(int**)malloc(sizeof(int*)*6);
	}
	for(i=0;i<c[cc_sum].cz_num;i++){
		for(j=0;j<6;j++){
			c[cc_sum].pcz[i][j]=(int*)malloc(sizeof(int)*10);
		}
	}
	for(i=0;i<c[cc_sum].cz_num;i++)
	{
		for(j=0;j<6;j++)
		{
			for(k=0;k<10;k++)
			{
				c[cc_sum].pcz[i][j][k]=0;
			}
		}
	}
	cc_sum++;
}
void delete_cc(){
	if(cc_sum==0){
		printf("暂无车次,请重新选择！\n");
		return;
	}
	int i;char delete_cc_name[40];
	printf("请从以下车次选择：\n");
	for(i=0;i<cc_sum;i++){
		printf("%d、---%s---共：%d站\n",i+1,c[i].cc_name,c[i].cz_sum);
	}
	printf("输入删除车次的名称：");
	scanf("%s",delete_cc_name);
	for(i=0;i<cc_sum;i++){
		if(strcmp(delete_cc_name,c[i].cc_name)==0){
			printf("删除车次：%s-----共：%d个站\n",c[i].cc_name,c[i].cz_sum);
			for(;i<cc_sum;i++){
			c[i]=c[i+1];
			}
			cc_sum--;
			return;
		}
	}
	printf("没有本车次,请重新输入！\n");
}
void update_cc(){
	if(cc_sum==0){
		printf("暂无车次,请重新选择！\n");
		return;
	}
	int i;int m=0;
	char update_cc_name[40];
	printf("请从以下车次选择：\n");
	for(i=0;i<cc_sum;i++){
		printf("%d、---%s\n",i+1,c[i].cc_name);
	}
	printf("输入车次的名称：");
	scanf("%s",update_cc_name);
	for(i=0;i<cc_sum;i++){
		if(strcmp(update_cc_name,c[i].cc_name)==0){
			printf("需更新的车次：%s-----共：%d个站\n",c[i].cc_name,c[i].cz_sum);
			while(1){
				printf("1、更新车次名称\n");
				printf("2、修改旗下车站\n");
				printf("3、以上均需要更新\n");
				printf("4、返回\n");
				scanf("%d",&m);
				if(m==1){
					printf("新的车次名：");
					scanf("%s",c[i].cc_name);
					printf("更新成功\n");
					return;
				}
				else if(m==2){
					update_cz_menu(i);
					printf("更新成功\n");
					return;
				}
				else if(m==3){
					printf("新的车次名：");
					scanf("%s",c[i].cc_name);
					update_cz_menu(i);
					printf("更新成功\n");
					return;
				}
				else if(m==4){
					return;
				}
				else{
					printf("输入错误");
				}
			}
		}
	}
	printf("没有本车次,请重新输入！\n");
}
void update_cz_menu(int a){
	int n;
	while(1){
		printf("车站处理：\n");
		printf("1、添加车站\n");
		printf("2、删除车站\n");
		printf("3、修改车站\n");
		printf("4、完成\n");
		scanf("%d",&n);
		if(n==1){
			upcc_add_cz(a);
		}
		else if(n==2){
			upcc_delete_cz(a);
		}
		else if(n==3){
			upcc_update_cz(a);
		}
		else if(n==4){
			break;
		}
		else{
			printf("输入错误，请重新输入！\n");
		}
	}
}
void upcc_add_cz(int a){
	int i,j,k;
	if(c[a].cz_sum>=c[a].cz_num){
		c[a].cz_num=c[a].cz_num+c[a].cz_num/3;
		c[a].z=realloc(c[a].z,sizeof(struct cz)*c[a].cz_num);
		c[a].pcz=(int***)realloc(c[a].pcz,sizeof(int**)*c[a].cz_num);	
			
		for(i=0;i<c[a].cz_num;i++){
			c[a].pcz[i]=(int**)realloc(c[a].pcz[i],sizeof(int*)*6);
			for(j=0;j<6;j++){
				c[a].pcz[i][j]=(int*)realloc(c[a].pcz[i][j],sizeof(int)*10);
			}
		}
		for(i=c[a].cz_sum;i<c[a].cz_num;i++){          //更新容量后 容量更新部分初始化
			for(j=0;j<6;j++){
				for(k=0;k<10;k++){
					c[a].pcz[i][j][k]=0;
				}
			}
		}
	}
	int cz_id;
	printf("车站id=");
	scanf("%d",&cz_id);
	for(i=0;i<c[a].cz_sum;i++){
		if(cz_id==c[a].z[i].cz_id){
			printf("本车次已有该车站，请重新添加！\n");
			return;
		}
	}
	c[a].z[c[a].cz_sum].cz_id==cz_id;
	printf("车站名称：");
	scanf("%s",c[a].z[c[a].cz_sum].cz_name);
	printf("票价=");
	scanf("%d",&c[a].z[c[a].cz_sum].price);
	c[a].cz_sum++;
	return;
}
void upcc_delete_cz(int a){
	if(c[a].cz_sum==0)
	{
		printf("该车次暂无途径车站！\n");
		return;
	}
	int i;char upcc_delete_cz_name[40];
	printf("输入此车次所需删除车站名：");
	scanf("%s",upcc_delete_cz_name);
	for(i=0;i<c[a].cz_sum;i++){
		if(strcmp(upcc_delete_cz_name,c[a].cc_name)==0){
			printf("车站：%s---id:%d----票价：%d----所属车次：%s\n",c[a].z[i].cz_name,c[a].z[i].cz_id,c[a].z[i].price,c[a].cc_name);
			for(;i<c[a].cz_sum;i++){
				c[a].z[i]=c[a].z[i+1];
			}		
			c[a].cz_sum--;
			return;
		}
	}	
}
void upcc_update_cz(int a){
	if(c[a].cz_sum==0)
	{
		printf("该车次暂无途径车站！\n");
		return;
	}
	int i;
	char upcc_update_cz_name[40];
	printf("输入此车次所需修改车站名：");
	scanf("%s",upcc_update_cz_name);
	for(i=0;i<c[a].cz_sum;i++){
		if(strcmp(upcc_update_cz_name,c[a].cc_name)==0){
			printf("车站：%s---id:%d----票价：%d----所属车次：%s\n",c[a].z[i].cz_name,c[a].z[i].cz_id,c[a].z[i].price,c[i].cc_name);
				printf("新的车站名：");
				scanf("%s",c[a].z[i].cz_name);
				printf("新的车站id：");
				scanf("%d",&c[a].z[i].cz_id);
				printf("新的票价：");
				scanf("%d",&c[a].z[i].price);
				return;
		}
	}
}
void menu(){
	int m=0;
	while(1){
		printf("#######铁路售票系统#######\n");
		printf("请选择以下栏目：\n");
		printf("1、管理员系统;\n");
		printf("2、用户系统;\n");
		printf("3、查询车票\n");
		printf("4、保存\n");
		printf("5、退出\n");
		scanf("%d",&m);
		switch(m){
			case 1:
				gl_dl_menu();
				break;
			case 2:
				kh_menu();
				break;
			case 3:
				find_pj();
				break;
			case 4:
				save();
				break;
			case 5:
				save();
				return;
			default:
				printf("输入错误\n");
				break;
		}
	}
}
